#ifndef GY_REPEATGROUP_H
#define GY_REPEATGROUP_H

#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"

class GY_CONTROLLIBRARY_EXPORT GY_RepeatGroup : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_RepeatGroup(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_RepeatGroup(){}
    void setName();
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    bool addItem(GY_Object *pItem) override;
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    bool removItem(const QString &guid) override;
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    bool removItem(const GY_Object *pItem) override;
    /**
     * @brief getPurObject 获取对象指针
     * @param name 变量名称
     * @param obj 空指针
     * @param childrensMap map容器
     * @return 对象指针
     */
    GY_Object* getPurObject(const QString& purposeObjName, GY_Object* obj, QMap<QString,GY_Object*> childrensMap) override;
    /**
     * @brief checkVarName 判断变量名称是否存在且合理
     * @param list 变量名称
     * @param childrensMap map容器
     * @return 判断结果
     */
    bool checkVarName(const QStringList& list, QMap<QString,GY_Object*> childrensMap) override;
    /**
     * @brief getPurposeType 获取目的属性类型
     * @param list 属性名称
     * @param childrensMap map容器
     * @return 属性类型
     */
    PropertyType getPurposeType(const QStringList& list, QMap<QString,GY_Object*> childrensMap) override;

public slots:
    /**
     * @brief updateCopyItemProperty 更新复制属性，与原版保持一致
     * @param pObject 更新属性的对象
     * @param propertyName 属性名称
     * @param propertyValue 属性值
     * @param type 属性类型
     */
    void updateCopyItemProperty(const GY_Object* pObject,const QString &propertyName,const QVariant &propertyValue,const PropertyType& type);

private:
    /**
     * @brief m_copyItemMap 加入的控件和它的复制品，以便控制复制品数量
     */
    QMap<GY_Object*,QVector<GY_Object*>> m_copyItemMap;
    ///
    /// \brief m_MaxCount 最大复制数
    ///
    int m_MaxCount = 0;

private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief updatePosition 更新位置
     * @param name 属性名称
     * @param value 位置
     * @return 是否更新成功
     */
    bool updatePosition(const QString &name, const QVariant &value);
    /**
     * @brief updateRepeatCount 更新复制数量
     * @param name 属性名称
     * @param value 数量
     * @return 是否更新成功
     */
    bool updateRepeatCount(const QString &name, const QVariant &value);
    /**
     * @brief updateLoopIndex 更新下标
     * @param name 属性名称
     * @param value 下标
     * @return 是否更新成功
     */
    bool updateLoopIndex(const QString &name, const QVariant &value);
    /**
     * @brief updateLoopIndex1 更新下标
     * @param name 属性名称
     * @param value 下标
     * @return 是否更新成功
     */
    bool updateLoopIndex1(const QString &name, const QVariant &value);
    /**
     * @brief updateLastConsumerIndex 更新----------未知属性
     * @param name 属性名称
     * @param value 
     * @return 是否更新成功
     */
    bool updateLastConsumerIndex(const QString &name, const QVariant &value);
    /**
     * @brief updatePosition 更新
     * @param name 属性名称
     * @param value 
     * @return 是否更新成功
     */
    bool updateFireLoopEvent(const QString &name, const QVariant &value);
    /**
     * @brief addLoopIndex 添加loopIndex属性值
     * @param count 需要达到的数目
     */
    void addLoopIndex(const int& count);

};

#endif // GY_REPEATGROUP_H
